Single-table Inheritance (STI) হল একটি ORM ডিজাইন প্যাটার্ন যেখানে একাধিক সাবক্লাসের ডেটা একটি একক টেবিলে সংরক্ষণ করা হয়। এই প্যাটার্নটি ব্যবহৃত হয় যখন একাধিক ক্লাসে একই ধরনের ডেটা থাকে, কিন্তু তাদের মধ্যে কিছু ভিন্নতা থাকতে পারে। STI সাধারণত ORM (Object-Relational Mapping) সিস্টেমে ব্যবহৃত হয়, যেখানে একাধিক ইনহেরিটেড ক্লাসের ডেটা একটিই টেবিলের মধ্যে রাখা হয় এবং একটি অতিরিক্ত কলাম দ্বারা পৃথকীকরণ করা হয়।
এই প্যাটার্নটি বিশেষভাবে কার্যকর যখন আপনি ক্লাস হায়ারার্কির মধ্যে শেয়ার করা প্রপার্টি গুলি একত্রে সংরক্ষণ করতে চান।
উদাহরণ:
ধরা যাক আমাদের একটি Employee নামক মূল ক্লাস আছে, এবং এর দুটি সাবক্লাস রয়েছে: Manager এবং Developer। সবগুলো ক্লাসের কিছু সাধারণ প্রপার্টি (যেমন name, email, salary) শেয়ার করা হয়, কিন্তু Manager ক্লাসে অতিরিক্ত department প্রপার্টি থাকতে পারে এবং Developer ক্লাসে programming_language প্রপার্টি থাকতে পারে।
মডেল কাঠামো:
# Base Class
class Employee(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
salary = models.DecimalField(max_digits=10, decimal_places=2)
class Meta:
abstract = True # This ensures that Employee itself isn't directly instantiated
# Derived Class 1: Manager
class Manager(Employee):
department = models.CharField(max_length=100)
# Derived Class 2: Developer
class Developer(Employee):
programming_language = models.CharField(max_length=50)
এই ক্ষেত্রে, Employee, Manager, এবং Developer ক্লাসগুলির মধ্যে মূল পার্থক্য হল যে Manager এবং Developer টেবিলের জন্য department এবং programming_language ফিল্ডগুলি আলাদা, কিন্তু সবগুলো ক্লাসের জন্য name, email, এবং salary ফিল্ডগুলি একই।
ডেটাবেজ টেবিলের কাঠামো:
এখন, STI প্যাটার্ন অনুযায়ী ডেটাবেজে এই সমস্ত ডেটা একটি একক টেবিলে সংরক্ষিত হবে, এবং সবগুলো ক্লাসের জন্য আলাদা রেকর্ড থাকবে। এই টেবিলটি দেখতে এরকম হতে পারে:
| id | name | salary | department | programming_language | type | |
|---|---|---|---|---|---|---|
| 1 | John Doe | john@example.com | 60000 | Marketing | NULL | Manager |
| 2 | Alice Smith | alice@example.com | 80000 | NULL | Python | Developer |
বিশেষ দৃষ্টি:
typeকলামটি তৈরি হয় (এটি প্রায়শই ORM স্বয়ংক্রিয়ভাবে তৈরি করে) যাতে প্রতিটি রেকর্ডের জন্য জানানো যায় কোন সাবক্লাসটি তা উপস্থাপন করছে।departmentকলামটি শুধুমাত্রManagerরেকর্ডের জন্য প্রযোজ্য, এবংprogramming_languageশুধুমাত্রDeveloperরেকর্ডের জন্য প্রযোজ্য।
সুবিধা:
- সহজ ডেটাবেস ডিজাইন: সমস্ত ডেটা একটি টেবিলেই সংরক্ষিত হয়, তাই ডেটাবেজে অনেক টেবিল না রেখে একটি টেবিলের মধ্যে সব কিছু রাখতে পারবেন।
- কমপ্লেক্স জোইন অপারেশন এড়ানো: যদি বিভিন্ন সাবক্লাস থেকে ডেটা একসাথে দরকার হয়, তাহলে জোইন করার দরকার পড়বে না।
অসুবিধা:
- নির্দিষ্ট কলামগুলির উপস্থিতি: কিছু সাবক্লাসের জন্য কিছু কলাম অপ্রয়োজনীয় হতে পারে (যেমন
departmentকলাম শুধুমাত্রManagerক্লাসে প্রযোজ্য)। এটা কিছু অপ্রয়োজনীয় ডেটা সংরক্ষণ হতে পারে, যা ডেটাবেজের পারফরমেন্সের উপর প্রভাব ফেলতে পারে। - ডেটাবেজের পরিবর্তন করা কঠিন হতে পারে: যখন ক্লাসের হায়ারার্কি পরিবর্তিত হয়, তখন ডেটাবেজের মডেলও আপডেট করতে হয়, যা কিছু সময়ের জন্য জটিল হতে পারে।
Conclusion:
Single-table Inheritance একটি শক্তিশালী প্যাটার্ন যখন আপনি একই টেবিলে একাধিক ইনহেরিটেড ক্লাসের ডেটা রাখতে চান, তবে এটিতে কিছু সীমাবদ্ধতা থাকতে পারে যেমন অপ্রয়োজনীয় কলামের উপস্থিতি এবং ডেটাবেজের স্কেলিং সমস্যা।